#include <cstdio>
#include <algorithm>
#include <cstring>
#include <queue>
#include <map>
using namespace std;
const int N=1e6+50;
const int M=5*1e6+50;
const int INF=0x3f3f3f3f;
int n,m,s,t;
int tot;
//指向某个星球的流量
map<int,int> num;
struct Edge{
    int u,v,w,next;
}edge[M];
int cnt;
int head[N];
void init(){
    cnt=0;
    tot=0;
    num.clear();
    memset(head,-1,sizeof(head));
}
void addEdge(int u,int v,int w){
    edge[cnt].u=u;
    edge[cnt].v=v;
    edge[cnt].w=w;
    edge[cnt].next=head[u];
    head[u]=cnt++;
    edge[cnt].u=v;
    edge[cnt].v=u;
    edge[cnt].w=0;
    edge[cnt].next=head[v];
    head[v]=cnt++;
}
int dep[N];
bool bfs(){
    queue<int> q;
    memset(dep,0,sizeof(dep));
    dep[s]=1;
    q.push(s);
    while(!q.empty()){
        int u=q.front();
        q.pop();
        for(int i=head[u];i!=-1;i=edge[i].next){
            int v=edge[i].v;
            int w=edge[i].w;
            if(w>0 && dep[v]==0){
                dep[v]=dep[u]+1;
                q.push(v);
            }
        }
    }
    return dep[t]!=0;
}
int cur[N];
int dfs(int u,int flow){
    if(u==t){
        return flow;
    }
    for(int &i=cur[u];i!=-1;i=edge[i].next){
        int v=edge[i].v;
        int w=edge[i].w;
        if(dep[v]==dep[u]+1 && w!=0){
            int dis=dfs(v,min(w,flow));
            if(dis>0){
                edge[i].w-=dis;
                edge[i^1].w+=dis;
                return dis;
            }
        }
    }
    return 0;
}
int Dinic(){
    int ans=0;
    while(bfs()){
        for(int i=0;i<=tot+m+1;i++){
            cur[i]=head[i];
        }
        while(int d=dfs(s,INF)){
            ans+=d;
        }
    }
    return ans;
}
int main(void){
    while(~scanf("%d%d",&n,&m)){
        init();
        int bit;
        for(int i=0;i<n;i++){
            int ret=0;
            for(int j=1;j<=m;j++){
                scanf("%d",&bit);
                ret+=(bit<<j);
            }
            num[ret]++;
        }
        for(map<int,int>::iterator it=num.begin();it!=num.end();it++){
            //从二进制还原成数位
            tot++;
            for(int i=1;i<=m;i++){
                if((it->first)&(1<<i)){
                    //人到星球
                    addEdge(tot,num.size()+i,it->second);   
                }
            }
            //源点到人
            addEdge(0,tot,it->second);
        }
        //星球到汇点
        for(int i=1;i<=m;i++){
            scanf("%d",&bit);
            addEdge(tot+i,tot+m+1,bit);
        }
        s=0;
        t=tot+m+1;
        int ans=Dinic();
        if(ans==n){
            printf("YES\n");
        }
        else{
            printf("NO\n");
        }
    }
    return 0;
}